﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using Cesave.Domain.Core.Specification;
using Cesave.Domain.PermisosModule.Resources;

namespace Cesave.Domain.PermisosModule.Contracts.CultivosFechas
{
    /// <summary>
    /// Especificación de búsqueda de fechas de cultivo mediante
    /// rango de fechas.
    /// </summary>
    public class CultivosFechasByDateRangeSpecification
        : Specification<CultivosFecha>
    {

        #region Private properties

        /// <summary>
        /// Fecha inicial
        /// </summary>
        private DateTime _fromDate = default(DateTime);

        /// <summary>
        /// Fecha límite.
        /// </summary>
        private DateTime _toDate = default(DateTime);

        #endregion

        #region Constructor

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="fromDate">
        /// Fecha inicial
        /// </param>
        /// <param name="toDate">
        /// Fecha límite.
        /// </param>
        public CultivosFechasByDateRangeSpecification(DateTime fromDate, DateTime toDate)
        {
            if (fromDate > DateTime.Now)
                throw new InvalidOperationException(Messages.exception_InvalidArgument);
            if (toDate < fromDate)
                throw new InvalidOperationException(Messages.exception_InvalidArgument);
            _fromDate = fromDate;
            _toDate = toDate;
        }

        #endregion

        #region Specification overrides

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override System.Linq.Expressions.Expression<Func<CultivosFecha, bool>> SatisfiedBy()
        {
            Specification<CultivosFecha> specification = new TrueSpecification<CultivosFecha>();
            specification &= new DirectSpecification<CultivosFecha>(f => f.InicioDeSolicitud >= _fromDate && f.InicioDeSiembra >= _fromDate);
            specification &= new DirectSpecification<CultivosFecha>(f => f.FinDeSolicitud <= _toDate && f.FinDeSiembra <= _toDate);
            return specification.SatisfiedBy();
        }

        #endregion

    }
}
